// 导入必要的头文件
#include <windows.h>
#include <cstdint>

// 定义窗口类名和窗口标题
#define WINDOW_CLASS_NAME L"SampleWindow"
#define WINDOW_TITLE L"Hello, World!"

// 定义窗口过程函数，用于处理窗口消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CREATE:
    {

        //for (int i = 0; i < 3; i++)
        //{
        //    CreateWindowEx(0,
        //        L"ChildWClass",
        //        (LPCTSTR)NULL,
        //        WS_CHILD | WS_BORDER | WS_VISIBLE,
        //        10, i * 102 + 10, 100, 100,
        //        hwnd,
        //        (HMENU)(int)(1000 + i),
        //        GetModuleHandleW(nullptr),
        //        NULL);
        //}
        return 0;
    }
    case WM_DESTROY: // 当窗口被销毁时，发送退出消息
        PostQuitMessage(0);
        return 0;
    case WM_PAINT: // 当窗口需要绘制时，使用默认的绘制函数
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);

        // All painting occurs here, between BeginPaint and EndPaint.
        FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_GRAYTEXT +1));
        EndPaint(hwnd, &ps);
    }
        return 0;
    default: // 对于其他消息，使用默认的窗口过程函数
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}

// 定义窗口过程函数，用于处理窗口消息
LRESULT CALLBACK WindowProc2(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY: // 当窗口被销毁时，发送退出消息
        PostQuitMessage(0);
        return 0;
    case WM_PAINT: // 当窗口需要绘制时，使用默认的绘制函数
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);

        // All painting occurs here, between BeginPaint and EndPaint.
        FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
        EndPaint(hwnd, &ps);
    }
    return 0;
    default: // 对于其他消息，使用默认的窗口过程函数
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}


// 定义主函数，用于创建和显示窗口
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // 注册窗口类
    WNDCLASS wc = { 0 };
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpfnWndProc = WindowProc; // 指定窗口过程函数
    wc.hInstance = hInstance; // 指定应用程序实例句柄
    wc.lpszClassName = WINDOW_CLASS_NAME; // 指定窗口类名
    RegisterClass(&wc);

    // 注册窗口类
    WNDCLASS wcc = { 0 };
    wcc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wcc.lpfnWndProc = WindowProc2; // 指定窗口过程函数
    wcc.hInstance = hInstance; // 指定应用程序实例句柄
    wcc.lpszClassName = L"ChildWClass"; // 指定窗口类名
    RegisterClass(&wcc);

    // 创建窗口
    HWND hwnd = CreateWindow(
        WINDOW_CLASS_NAME, // 窗口类名
        WINDOW_TITLE, // 窗口标题
        WS_OVERLAPPEDWINDOW | WS_VISIBLE, // 窗口样式，包括可调整大小和可见
        CW_USEDEFAULT, // 窗口水平位置，由系统自动选择
        CW_USEDEFAULT, // 窗口垂直位置，由系统自动选择
        CW_USEDEFAULT, // 窗口宽度，由系统根据窗口类和样式自动计算
        CW_USEDEFAULT, // 窗口高度，由系统根据窗口类和样式自动计算
        NULL, // 父窗口句柄，没有则为NULL
        NULL, // 窗口菜单句柄，没有则为NULL
        hInstance, // 应用程序实例句柄
        NULL // 附加参数，没有则为NULL
    );

    // 检查窗口是否创建成功
    if (hwnd == NULL)
    {
        MessageBox(NULL, L"创建窗口失败！", L"错误", MB_OK | MB_ICONERROR);
        return -1;
    }

    for (int i = 0; i < 3; i++)
    {
        CreateWindowEx(0,
            L"ChildWClass",
            (LPCTSTR)NULL,
            WS_CHILD | WS_BORDER | WS_VISIBLE,
            10, i * 52 + 10, 100, 100,
            hwnd,
            (HMENU)(int64_t)(1000 + i),
            GetModuleHandleW(nullptr),
            NULL);
    }

    // 进入消息循环，等待用户操作
    MSG msg = { 0 };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg); // 转换虚拟键消息为字符消息
        DispatchMessage(&msg); // 分发消息给相应的窗口过程函数
    }

    // 返回退出代码
    return (int)msg.wParam;
}